你的毅力讓人佩服,今天我們要來玩玩非同步的模式,將非同步的過程加入觀察,看看迸出什麼火花!
延續著昨天的教學,我們在subscribe
的前後印出before及after,並觀察看看印出什麼資訊。
import { Observable } from 'rxjs';
// 被觀察的目標(Observable)
const obs$ = new Observable((subscriber) => {
subscriber.next('1');
subscriber.next('2');
subscriber.next('3');
subscriber.complete(); // 結束!
});
// 觀察者(Observer)
const observer = {
next: (data) => console.log(`checked ${data}, next!`),
error: (err) => console.log(`error is occured: ${err}}`),
complete: () => console.log(`complete`),
};
// 訂閱
console.log('=== before ==='); //<-- before
obs$.subscribe(observer); // 開始一連串的進行資料的傳遞,就像`data streaming`一樣
console.log('=== after ==='); //<-- after
// 訂閱後印出資訊如下
// === before ===
// checked 1, next!
// checked 2, next!
// checked 3, next!
// === after ===
Observable
依循blocking
的方式來進行,所以才會先有before,後有after。setInterval
來設計async
程式。
- 設定 變數count
- 每 1秒鐘 ,count+1,並呼叫
next
送出- 5秒過後,結束訂閱
// 被觀察的目標(Observable)
const asyncObs$ = new Observable((subscriber) => {
// 第一步:加入async程式
let count = 0;
const id = setInterval(() => {
count += 1;
subscriber.next(count); // next() 送出資料
}, 1000);
// 第二步: 回傳一個function來代表 "結束訂閱"(參考補充說明1)
return () => {
console.log('結束訂閱!!');
clearInterval(id);
};
});
...
// 訂閱
console.log('=== before ===');
const mySubscript$ = asyncObs$.subscribe(observer); // 開始訂閱
setTimeout(() => mySubscript$.unsubscribe(), 5000); // 五秒後結束訂閱
console.log('=== after ===');
// 訂閱後印出資訊如下
// === before ===
// === after ===
// checked 1, next!
// checked 2, next!
// checked 3, next!
// checked 4, next!
// checked 5, next!
// 結束訂閱!!
- 第一步: 加入async程式,每1秒鐘用
next
發出訊息- 第二步: 取消訂閱後要呼叫的程式。(這裡稱之為
TeardownLogic
,有興趣可以看一下補充說明1)- 第三步: 訂閱,並取得
mySubscript$
- 第四步: 設定5秒鐘之後,將
mySubscript$
取消訂閱
before
及after
之後,再處理非同步的部分,依序印出1,2,3,4,5。Observable
與TearDownLogic
的關係如下,這裡看不懂也沒關係,可以先有個概念即可。✍